POJ 1797 Heavy Transportation

猛一看,好像是最大流,再一看,不是的……幸亏不是如果是我还一时写不出来,哈哈!

用变形的Dijsktra就可以做出来。。

我都可以做出来的题,那真叫一个水题!

View Code
#include <stdio.h>
#include <memory.h>

#define N 1002
#define M 500000

int nodevp[N];
int nodeu[M],data[M],next[M],ind;
int dist[N];
bool flag[N];

void addedge(int v,int u,int val)
{
nodeu[ind]=u;
data[ind]=val;
next[ind]=nodevp[v];
nodevp[v]=ind++;
}

void Dijsktra(int s,int e,int n)
{
int i,v,u,min;

memset(dist,0,sizeof(dist));
memset(flag,0,sizeof(flag));
for(i=nodevp[s];~i;i=next[i]) dist[nodeu[i]]=data[i];
flag[s]=true;

while(true)
{
for(v=0,i=1;i<=n;i++)
{
if(!flag[i] && dist[i]>dist[v])
v=i;
}

if(v==e) return ;

flag[v]=true;
for(i=nodevp[v];~i;i=next[i])
{
u=nodeu[i];
if(!flag[u])
{
min = dist[v]<data[i]?dist[v]:data[i];
if(min>dist[u]) dist[u]=min;
}
}
}

}

int main()
{
int t,n,m,cas=0;
int i,v,u,val;
freopen("input.txt","r",stdin);
scanf("%d",&t);

while(t--)
{
memset(nodevp,-1,sizeof(nodevp)); ind=0;
scanf("%d %d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%d %d %d",&v,&u,&val);
addedge(v,u,val);
addedge(u,v,val);
}

Dijsktra(1,n,n);
printf("Scenario #%d:\n%d\n\n",++cas,dist[n]);
}


return 0;
}



原文地址:https://www.cnblogs.com/fornever/p/2394178.html