题意:给出一系列的关系图,每两个人求对方办事会花费多少钱,1要将儿子送到n那去读书,利用这些关系来完成,但是你和1有矛盾想让他完成不了,你有一个权利让其中一个人不做这些事,除了1和n之外的其他人都会答应你,如果1不能完成则输出Inf,不然输出,他要花费的最大价值
思路:用最短路完成,遍历2~n-1这些点,将他们标记后就不能在使用,然后求最短路,如果走不到n,则输出Inf,不然我们就找出最大值输出,模版题
#include <queue>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=40;
int v[maxn],num[maxn][maxn],ans[maxn];
void init(int n){
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
if(i==j) num[i][j]=0;
else num[i][j]=inf;
}
int dijkstra(int n,int start){
memset(ans,inf,sizeof(ans));
for(int i=1;i<=n;i++)
ans[i]=num[start][i];
v[start]=1;
for(int i=0;i<n;i++){
int minidx=0;
int minnum=inf;
for(int j=0;j<=n;j++){
if(v[j]==0&&ans[j]<minnum)
minnum=ans[j],minidx=j;
}
v[minidx]=1;
for(int j=0;j<=n;j++){
if(v[j]==0&&ans[j]>num[minidx][j]+ans[minidx])
ans[j]=ans[minidx]+num[minidx][j];
}
}
return ans[n];
}
int main(){
int n,m,a,b,c;
while(scanf("%d%d",&n,&m)!=-1){
if(n==0&&m==0) break;
init(n);
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
num[a][b]=num[b][a]=min(num[a][b],c);
}
bool flag=0;
int res=0;
for(int i=2;i<n;i++){
memset(v,0,sizeof(v));
v[i]=1;
int t=dijkstra(n,1);
if(t==inf) {flag=1;break;}
res=max(res,t);
}
if(flag) printf("Inf\n");
else printf("%d\n",res);
}
return 0;
}