讨论 / 求解释
洗头用酱油 2011-10-05 04:49:00
点我顶贴 收藏 删除
不知道为什么,只能过前两个点。

我是每次spfa找最短路。

谁能解释下,为什么WA 谢谢。

小数据用的邻接矩阵。

#include<iostream>

#include<stdio.h>

#include<cstring>

using namespace std;

int map[500][500],cost[500][500];

bool hash[500];

int q[100000];

int n,ans;

int pre[500];

int dist[500];

void init()

{

freopen("s.in","r",stdin);

freopen("s.out","w",stdout);

}

void readdata()

{

scanf("%d\n",&n);

int i,x,y,j;

for(i=1; ; i++)

{

scanf("%d%d",&x,&y);

if(x==0 && y==0) break;

int tem;

scanf("%d%d\n",&map[x][y],&cost[x][y]);

cost[y][x]=-cost[x][y];

}

}

bool spfa()

{

int head,tail,i,x;

memset(hash,false,sizeof(hash));

for(i=1; i<=n; i++)

dist[i]=9999999;

head=0;

tail=1;

q[1]=1;

pre[1]=0;

dist[1]=0;

hash[1]=true;

do

{

head++;

x=q[head];

hash[x]=false;

for(i=1; i<=n; i++)

if(map[x][i]>0 && dist[i]>dist[x]+cost[x][i])

{

dist[i]=dist[x]+cost[x][i];

pre[i]=x;

if(hash[i]==false)

{

tail++;

q[tail]=i;

hash[i]=true;

}

}

}while(head<tail);

if(dist[n]<9999999) return true;

return false;

}

int min(int x,int y)

{

if(x<y) return x;

return y;

}

void deal()

{

int i,tem=999999;

for(i=n; i!=1; i=pre[i])

{

tem=min(tem,map[pre[i]][i]);

}

for(i=n; i!=1; i=pre[i])

{

map[pre[i]][i]-=tem;

map[i][pre[i]]+=tem;

ans+=cost[pre[i]][i]*tem;

}

}

void work()

{

ans=0;

while(spfa())

{

deal();

}

}

void print()

{

printf("%d\n",ans);

}

int main()

{

//init();

readdata();

work();

print();

return 0;

}

#1 1965131end@2011-05-19 17:38:00
回复 删除
#include<iostream>

#include<stdio.h>

#include<cstring>

using namespace std;

int map[500][500],cost[500][500];

bool hash[500];

int q[100000];

int n,ans;

int pre[500];

int dist[500];

void init()

{

freopen("s.in","r",stdin);

freopen("s.out","w",stdout);

}

void readdata()

{

scanf("%d\n",&n);

int i,x,y,j;

for(i=1; ; i++)

{

scanf("%d%d",&x,&y);

if(x==0 && y==0) break;

int tem;

scanf("%d%d\n",&map[x][y],&cost[x][y]);

cost[y][x]=-cost[x][y];

}

}

bool spfa()

{

int head,tail,i,x;

memset(hash,false,sizeof(hash));

for(i=1; i<=n; i++)

dist[i]=9999999;

head=0;

tail=1;

q[1]=1;

pre[1]=0;

dist[1]=0;

hash[1]=true;

do

{

head++;

x=q[head];

hash[x]=false;

for(i=1; i<=n; i++)

if(map[x][i]>0 && dist[i]>dist[x]+cost[x][i])

{

dist[i]=dist[x]+cost[x][i];

pre[i]=x;

if(hash[i]==false)

{

tail++;

q[tail]=i;

hash[i]=true;

}

}

}while(head<tail);

if(dist[n]<9999999) return true;

return false;

}

int min(int x,int y)

{

if(x<y) return x;

return y;

}

void deal()

{

int i,tem=999999;

for(i=n; i!=1; i=pre[i])

{

tem=min(tem,map[pre[i]][i]);

}

for(i=n; i!=1; i=pre[i])

{

map[pre[i]][i]-=tem;

map[i][pre[i]]+=tem;

ans+=cost[pre[i]][i]*tem;

}

}

void work()

{

ans=0;

while(spfa())

{

deal();

}

}

void print()

{

printf("%d\n",ans.0);

}

int main()

{

//init();

readdata();

work();

print();

return 0;

}

#2 海角@2011-10-05 01:25:00
回复 删除
这道题有重边,矩阵过不了

还是写个邻接表最安全。

#3 sunzhouyi@2011-10-05 04:49:00
回复 删除
回复 板凳海角 的帖子

ym神犇!!!!!!!!!!!!!!!!!!!!!!!!!!1

查看更多回复
提交回复