讨论 / 牛给看下,样例都过不了~~~~
飞雪天涯 2009-08-06 04:55:00
点我顶贴 收藏 删除
挥霍了15分~

求解!

/*

查看题目 Show Problem

题目:网络运输货物

问题编号:481 [提交该题] [讨论该问题] [有关讨论] [Who AC] [相关题解] [最优解]

My Flag:Unaccepted

题目类型

网络流

描述

有一条公路,点1是仓库所在地(物资的起点),n是某一工地(物资的终点)每条弧旁的两个数字分别表示某一时间内通过该段路的最多吨数和每吨物资通过该段路的费用。

输入格式

第一行:1个数N(0<n<100)

从第2行~+00行 是a到b 能通过c吨 每吨价值为d。

(0<a,b<100)

输出格式

1个数:通过最多货物使用的最小钱。

样例输入

5

1 2 10 4

1 3 8 1

2 4 2 6

2 5 7 1

3 2 5 2

3 4 10 3

4 5 4 2

0 0 0 0

样例输出

55

*/

#define MAX 10000000

#define MAXN 100

#define MAXE 10000

#include<iostream>

using namespace std;

struct edge

{

int from;

int to;

int cost;

int capacity;

int next;

} edges[MAXE+1];

int hLink[MAXN+1],index=0,n;

void insert(int from,int to,int cost,int capacity){

index++;

edges[index].from=from;

edges[index].to=to;

edges[index].cost=cost;

edges[index].capacity=capacity;

edges[index].next=hLink[from];

hLink[from]=index;

}

int dis[MAXN+1];

int que[MAXE],nxt[MAXN+1],front,rear;

bool inque[MAXN+1];

bool spfa(){

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

inque[i]=false;

dis[i]=MAX;

}

dis[1]=0;

front=rear=0;

inque[1]=true;

que[rear++]=1;

nxt[1]=0;

while (front<rear){

int present=que[front++];

front%=MAXE;

inque[present]=false;

for (int i=hLink[present];i;){

if (edges[i].capacity==0){

i=edges[i].next;

continue;

}

if (dis[edges[i].to]>dis[present]+edges[i].cost){

dis[edges[i].to]=dis[present]+edges[i].cost;

nxt[edges[i].to]=i;

if (!inque[edges[i].to]){

inque[edges[i].to]=true;

que[rear++]=edges[i].to;

rear%=MAXE;

}

}

i=edges[i].next;

}

}

return dis[n]!=MAX;

}

int ans=0;

void maxflow(){

int MinCap=MAX;

for (int i=nxt[n];i;i=nxt[edges[i].from])

if (MinCap>edges[i].capacity)

MinCap=edges[i].capacity;

for (int i=nxt[n];i;i=nxt[edges[i].from]){

edges[i].capacity-=MinCap;

ans+=MinCap*edges[i].cost;

}

}

int mincostmaxflow(){

while (spfa()) maxflow();

return ans;

}

int main (void){

cin>>n;

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

hLink[i]=0;

int a,b,c,d;

cin>>a>>b>>c>>d;

while (a!=0||b!=0||c!=0||d!=0){

insert(a,b,c,d);

cin>>a>>b>>c>>d;

}

cout<<mincostmaxflow();

while (1);

return 0;

}

#1 飞雪天涯@2009-07-04 08:11:00
回复 删除
查看状态 Show Status

状态题目:网络运输货物

题目编号:481-网络运输货物 查看该题

状态: Unaccepted

测评机: Xeost[5]

得分: 10分

提交日期: 2009-7-4 23:10:00

有效耗时: 47毫秒

测试结果1: 测试结果错误.错误结果为:49

正确结果应为:55

测试结果2: 通过本测试点|有效耗时47ms

测试结果3: 测试结果错误.错误结果为:169

正确结果应为:107

测试结果4: 测试结果错误.错误结果为:2257

正确结果应为:3640

测试结果5: 测试结果错误.错误结果为:4749

正确结果应为:5386

测试结果6: 测试结果错误.错误结果为:12054

正确结果应为:22612

测试结果7: 测试结果错误.错误结果为:35032

正确结果应为:11386

测试结果8: 测试结果错误.错误结果为:13584

正确结果应为:13490

测试结果9: 测试结果错误.错误结果为:34797

正确结果应为:25883

测试结果10: 测试结果错误.错误结果为:24436

正确结果应为:28273

提交代码: /*

查看题目 Show Problem

题目:网络运输货物

问题编号:481 [提交该题] [讨论该问题] [有关讨论] [Who AC] [相关题解] [最优解]

My Flag:Unaccepted

题目类型

网络流

描述

有一条公路,点1是仓库所在地(物资的起点),n是某一工地(物资的终点)每条弧旁的两个数字分别表示某一时间内通过该段路的最多吨数和每吨物资通过该段路的费用。

输入格式

第一行:1个数N(0<n<100)

从第2行~+00行 是a到b 能通过c吨 每吨价值为d。

(0<a,b<100)

输出格式

1个数:通过最多货物使用的最小钱。

样例输入

5

1 2 10 4

1 3 8 1

2 4 2 6

2 5 7 1

3 2 5 2

3 4 10 3

4 5 4 2

0 0 0 0

样例输出

55

*/

#define MAX 10000000

#define MAXN 100

#define MAXE 10000

#include<iostream>

using namespace std;

struct edge

{

int from;

int to;

int cost;

int capacity;

int next;

} edges[MAXE+1];

int hLink[MAXN+1],index=0,n;

void insert(int from,int to,int cost,int capacity){

index++;

edges[index].from=from;

edges[index].to=to;

edges[index].cost=cost;

edges[index].capacity=capacity;

edges[index].next=hLink[from];

hLink[from]=index;

}

int dis[MAXN+1];

int que[MAXE],nxt[MAXN+1],front,rear;

bool inque[MAXN+1];

bool spfa(){

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

inque[i]=false;

dis[i]=MAX;

}

dis[1]=0;

front=rear=0;

inque[1]=true;

que[rear++]=1;

nxt[1]=0;

while (front<rear){

int present=que[front++];

front%=MAXE;

inque[present]=false;

for (int i=hLink[present];i;){

if (edges[i].capacity==0){

i=edges[i].next;

continue;

}

if (dis[edges[i].to]>dis[present]+edges[i].cost){

dis[edges[i].to]=dis[present]+edges[i].cost;

nxt[edges[i].to]=i;

if (!inque[edges[i].to]){

inque[edges[i].to]=true;

que[rear++]=edges[i].to;

rear%=MAXE;

}

}

i=edges[i].next;

}

}

return dis[n]!=MAX;

}

int ans=0;

void maxflow(){

int MinCap=MAX;

for (int i=nxt[n];i;i=nxt[edges[i].from])

if (MinCap>edges[i].capacity)

MinCap=edges[i].capacity;

for (int i=nxt[n];i;i=nxt[edges[i].from]){

edges[i].capacity-=MinCap;

ans+=MinCap*edges[i].cost;

}

}

int mincostmaxflow(){

while (spfa()) maxflow();

return ans;

}

int main (void){

cin>>n;

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

hLink[i]=0;

int a,b,c,d;

cin>>a>>b>>c>>d;

while (a!=0||b!=0||c!=0||d!=0){

insert(a,b,c,d);

cin>>a>>b>>c>>d;

}

cout<<mincostmaxflow();

// while (1);

return 0;

}

#2 飞雪天涯@2009-07-04 08:12:00
回复 删除
[color=red]想CHEAT啊!!!

-------没胆![/color]

#3 飞雪天涯@2009-07-04 08:20:00
回复 删除
下线了,有事明天再说~~~

sleeping~~~

#4 wish@2009-07-04 09:18:00
回复 删除
这个题非常诡异

从我原来cheat的结果来看

貌似有回边、有重边,但没有负权边

但我依然 wa。。。

#5 飞雪天涯@2009-07-04 20:42:00
回复 删除
WAWAWA
#6 飞雪天涯@2009-07-05 04:53:00
回复 删除
改了一下,60,还是WA~

-------------------------------------------

查看状态 Show Status

状态题目:网络运输货物

题目编号:481-网络运输货物 查看该题

状态: Unaccepted

测评机: Xeost[5]

得分: 60分

提交日期: 2009-7-5 19:51:00

有效耗时: 313毫秒

测试结果1: 测试结果错误.错误结果为:60

正确结果应为:55

测试结果2: 通过本测试点|有效耗时47ms

测试结果3: 测试结果错误.错误结果为:184

正确结果应为:107

测试结果4: 通过本测试点|有效耗时63ms

测试结果5: 通过本测试点|有效耗时47ms

测试结果6: 通过本测试点|有效耗时63ms

测试结果7: 测试结果错误.错误结果为:12739

正确结果应为:11386

测试结果8: 通过本测试点|有效耗时47ms

测试结果9: 通过本测试点|有效耗时46ms

测试结果10: 测试结果错误.错误结果为:37481

正确结果应为:28273

提交代码: /*

查看题目 Show Problem

题目:网络运输货物

问题编号:481 [提交该题] [讨论该问题] [有关讨论] [Who AC] [相关题解] [最优解]

My Flag:Unaccepted

题目类型

网络流

描述

有一条公路,点1是仓库所在地(物资的起点),n是某一工地(物资的终点)每条弧旁的两个数字分别表示某一时间内通过该段路的最多吨数和每吨物资通过该段路的费用。

输入格式

第一行:1个数N(0<n<100)

从第2行~+00行 是a到b 能通过c吨 每吨价值为d。

(0<a,b<100)

输出格式

1个数:通过最多货物使用的最小钱。

样例输入

5

1 2 10 4

1 3 8 1

2 4 2 6

2 5 7 1

3 2 5 2

3 4 10 3

4 5 4 2

0 0 0 0

样例输出

55

*/

#define MAX 10000000

#define MAXN 100

#define MAXE 10000

#include<iostream>

using namespace std;

struct edge

{

int from;

int to;

int cost;

int capacity;

int next;

} edges[MAXE+1];

int hLink[MAXN+1],index=0,n;

void insert(int from,int to,int cost,int capacity){

index++;

edges[index].from=from;

edges[index].to=to;

edges[index].cost=cost;

edges[index].capacity=capacity;

edges[index].next=hLink[from];

hLink[from]=index;

}

int dis[MAXN+1];

int que[MAXE],nxt[MAXN+1],front,rear;

bool inque[MAXN+1];

bool spfa(){

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

inque[i]=false;

dis[i]=MAX;

}

dis[1]=0;

front=rear=0;

inque[1]=true;

que[rear++]=1;

nxt[1]=0;

while (front<rear){

int present=que[front++];

front%=MAXE;

inque[present]=false;

for (int i=hLink[present];i;){

if (edges[i].capacity==0){

i=edges[i].next;

continue;

}

if (dis[edges[i].to]>dis[present]+edges[i].cost){

dis[edges[i].to]=dis[present]+edges[i].cost;

nxt[edges[i].to]=i;

if (!inque[edges[i].to]){

inque[edges[i].to]=true;

que[rear++]=edges[i].to;

rear%=MAXE;

}

}

i=edges[i].next;

}

}

return dis[n]!=MAX;

}

int ans=0;

void maxflow(){

int MinCap=MAX;

for (int i=nxt[n];i;i=nxt[edges[i].from])

if (MinCap>edges[i].capacity)

MinCap=edges[i].capacity;

for (int i=nxt[n];i;i=nxt[edges[i].from]){

edges[i].capacity-=MinCap;

ans+=MinCap*edges[i].cost;

}

}

int mincostmaxflow(){

while (spfa()) maxflow();

return ans;

}

int main (void){

cin>>n;

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

hLink[i]=0;

int a,b,c,d;

cin>>a>>b>>d>>c;

while (a!=0||b!=0||c!=0||d!=0){

insert(a,b,c,d);

cin>>a>>b>>d>>c;

}

cout<<mincostmaxflow();

// while (1);

return 0;

}

#7 飞雪天涯@2009-07-07 07:13:00
回复 删除
鬼题~
#8 B-L-A-C-K@2009-07-08 02:37:00
回复 删除
我也WA,过了7个点。竟然结果能求出负值!什么情况?
#9 小小小学生@2009-07-08 03:05:00
回复 删除
通过最多货物使用的最小钱。

这个,太显然了吧!?

#10 zrp@2009-07-08 20:14:00
回复 删除
费用流吗这不?...
查看更多回复
提交回复