| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
SPFA WA了,BellmanFord AC了。求解。程序如下,SPFA被注释了。
#include <cstdio>
#include <cstring>
#define oo 2147483647
#define maxn 10001
#define maxm 31111
using namespace std;
struct edge_type
{
int x,y,cost,next;
};
int n,m,total;
bool mark[maxn + 1];
int stack[maxn + 1];
int dist[maxn + 1];
int first[maxn + 1];
edge_type g[maxm + 1];
void add(int x,int y,int cost)
{
g[++total].x = x; g[total].y = y; g[total].cost = cost;
g[total].next = first[x];
first[x] = total;
}
void spfa()
{
memset(mark,0,sizeof(mark));
memset(dist,0,sizeof(dist));
for (int i=1;i<=n;i++){ //这段是BellmanFord
bool flag = 0;
for (int j=1;j<=total;j++){
int x = g[j].x,y = g[j].y,c = g[j].cost;
if (dist[x] + c>dist[y]){
dist[y] = dist[x] + c;
flag = 1;
}
}
if (!flag) break;
}
/* SPFA在这里
int top = 1;
for (top=1;top<=n + 1;top++){
stack[top] = top - 1;
}
while (top){
int x = stack[top --];
mark[x] = 0;
for (int temp=first[x];temp;temp=g[temp].next){
int y = g[temp].y;
int tmp;
if ((tmp = dist[x] + g[temp].cost)>dist[y]){
dist[y] = tmp;
if (!mark[y]){
mark[y] = 1;
stack[++top] = y;
}
}
}
} */
/*
for (int i=1;i<=n;i++){
printf("%d ",dist[i]);
}
printf("\n");
*/
}
int main()
{
freopen("1716.in","r",stdin);
freopen("1716.out","w",stdout);
while (scanf("%d",&m)==1){
total = 0;
memset(first,0,sizeof(first));
n = 0;
for (int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
b ++;
if (a>b){
int tmp = a; a = b; b = tmp;
}
if (b>n) n = b;
add(a,b,2);
}
for (int i=0;i<=n;i++){
add(i,i + 1,0);
add(i + 1,i,-1);
}
spfa();
printf("%d\n",dist[n]);
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator