最短路径的反向,我用了迪杰斯特拉,注意数组要大原数据的大小,我错了我几次就是应为这里。
AC代码(c++)
#include <iostream>
#include<string.h>
#define INF 0x3f3f3f3f
using namespace std;
int c[1001];
int a[1001][1001];
int vis[1001];
int n,m;
void f()
{
int i,j,k;
for(i=1; i<=n; i++)
{
c[i]=a[1][i];
}
vis[1]=1;
int maxx;
for(i=1;i<=n;i++)
{
maxx=0;
int p;
for(j=1; j<=n; j++)
{
if(!vis[j]&&c[j]>maxx)
{
maxx=c[j];
p=j;
}
}
if(maxx==0)
break;
vis[p]=1;
for(k=1; k<=n; k++)
{
if(!vis[k]&&c[k]<min(c[p],a[p][k])&&a[p][k]<INF) //1
{
c[k]=min(c[p],a[p][k]);
}
}
}
}
int main()
{
int t;
cin>>t;
int num=1;
while(t--)
{
memset(vis,0,sizeof (vis));
memset(a,0,sizeof(a));
cin>>n>>m;
int u,v,l;
for(int i=1; i<=m; i++)
{
cin>>u>>v>>l;
if(a[u][v]<l)
a[u][v]=a[v][u]=l;
}
cout<<"Scenario #"<<num++<<":"<<endl;
f();
cout<<c[n]<<endl<<endl;
}
return 0;
}
1:最大的点到1的值和这个点到N点的值取最小,和N直接到1的值比较。