Input:
There are several test cases. For each test case: The first line contains two integers N and M. N means that there are N people in Boss Liu's guanxi net. They are numbered from 1 to N. Boss Liu is No. 1 and the schoolmaster is No. N. M means that there are M guanxis in Boss Liu's guanxi net. (3 <=N <= 30, 3 <= M <= 1000) Then M lines follow. Each line contains three integers A, B and C, meaning that there is a guanxi between A and B, and if A asks B or B asks A for help, the helper will be paid C RMB by Boss Liu. The input ends with N = 0 and M = 0. It's guaranteed that Boss Liu's request can reach the schoolmaster if you do not try to undermine his plan. Output: For each test case, output the minimum money Boss Liu has to spend after you have done your best. If Boss Liu will fail to send his kid to the middle school, print "Inf" instead.Sample Input: 4 5 1 2 3 1 3 7 1 4 50 2 3 4 3 4 2 3 2 1 2 30 2 3 10 0 0Sample Output: 50 Inf题意:
就是富豪想托关系把自己的儿子送进好学校(现实啊),给出富豪的关系网和每个人要的辛苦费(金钱关系),而你鄙视富豪的这种做法,现在假设你可以说动一个人拒绝帮忙(富豪和校长除外),求你可以让富豪花费的最多的钱是多少,如果可以阻止富豪的行为(让富豪联系不上校长)则输出Inf,题目保证如果你不加干扰富豪一定能成功。
思路:
以校长为起点进行广搜,再对每个点进行Spfa求去掉此点后的最短路径。
代码:
#include<iostream> #include<cstring> #include<cmath> #include<stdio.h> #include<queue> #include<vector> #define INF 0x3f3f3f3f using namespace std; int N,M; bool markB[35]; int map[35][35]; int sum; struct D{ int r,m; D(int a,int b){ r = a; m = b; } }; int len[35]; bool book[35]; void Spfa(int i){ memset(len,INF,sizeof(len)); len[1] = 0; book[1] = true; queue<int>Q; Q.push(1); while(!Q.empty()){ int mid = Q.front(); Q.pop(); book[mid] = false; for(int k=1 ; k<=N ; k++){ if(k == i)continue; if(len[k]>len[mid]+map[mid][k]){ len[k] = len[mid]+map[mid][k]; if(!book[k]){ book[k] = true; Q.push(k); } } } } } int minn; int BFS(){ queue<int>Q; Q.push(N); markB[N] = true; while(!Q.empty()){ int mid = Q.front(); Q.pop(); for(int i=2 ; i<N ; i++){ if(map[mid][i] != INF){ if(markB[i] == false){ Q.push(i); markB[i] = true; Spfa(i); if(len[N] == INF)return -1; else if(minn<len[N])minn = len[N]; } } } } return 1; } int main(){ while(scanf("%d %d",&N,&M) && N|M){ memset(map,INF,sizeof(map)); memset(markB,false,sizeof(markB)); minn = 0; while(M--){ int a,b,c; scanf("%d %d %d",&a,&b,&c); if(map[a][b]>c)map[a][b] = map[b][a] = c; } if(BFS() == 1)printf("%d\n",minn); else printf("Inf\n"); } return 0; }