题目初看起来很像网络流但,细看就发现不是了
题目大意是求从源点1能通过一条路径使能运送到终点n的输送流量最大
此题可以用最短路的几个算法来做,用SPFA优化比较快,由于本人比较捉鸡,所以就套了一下dijstra算法
细节可以看代码里的注释
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
long long W[1015][1015],d[1015];//图不是特别大就用邻接矩阵填了
bool vis[1015];
int node_num,edge_num;
using namespace std;
void read()
{
for(int i=0;i<1011;i++)
for(int j=0;j<1011;j++)
W[i][j]=0;//一定要初始化为0 ,啊,捉鸡,为什么没用memset?
int i=0,a,b;
cin>>node_num>>edge_num;
while(++i<=edge_num)
{
int a,b,c;cin>>a>>b>>c;
W[a][b]=W[b][a]=c;
}
}
void dijstra(int ii) //这个 dijstra 是刘汝佳竞赛入门里的代码,没怎么优化,所以会慢一点,但是这个数据范围不大还是可以过的啦~~~
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=node_num;i++)
d[i]=W[1][i];//初始化从源点到每个点能够输送的流量
for(int i=1;i<=node_num;i++)
{
int x,m=0;//这m一定要初始化为0,而最短路得时候是初始化为INF
for(int y=1;y<=node_num;y++) if(!vis[y]&&d[y]>=m) m=d[x=y];//同理这个也要改成大于m了
vis[x]=1;
for(int y=1;y<=node_num;y++)
{
long long k=min(d[x],W[x][y]);//k 是当前能传到此处的可取流量
d[y]=max(k,d[y]);//选择能传到此处的可取流量的最大流量
}
}
cout<<"Scenario #"<<ii<<":\n"<<d[node_num]<<endl<<endl;//输出时注意每次要多输出一个空行
}
int main()
{
int T,ii=0;cin>>T;
while(++ii<=T)
{
read();
dijstra(ii);
}
return 0;
}