poj 1797 最短路变形

题目初看起来很像网络流但,细看就发现不是了

题目大意是求从源点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;
}

你可能感兴趣的:(poj 1797 最短路变形)