现在的位置: 首页 > 综合 > 正文

POJ 3767 RE+WA到死

2013年09月13日 ⁄ 综合 ⁄ 共 1614字 ⁄ 字号 评论关闭

I Wanna Go Home

 

传送门:http://acm.pku.edu.cn/JudgeOnline/problem?id=3767

 

这道题目,真不爽......开始是两边dijkstra处理的,用一个for循环,连接两个camp

 

,结果忘记了一个很致命的疏忽: 就是比如 从 1阵营 到 2 阵营,1(1)->7(2)-->2(2),没有保证 1-->7是最短的

 

只是保证了在所有的1阵营中,1到其他的点是最短的,也是我wa了好多次的原因。

 

更郁闷的是,RE出现了好多次,结果程序反复写了好几次,纠结的是,有的程序用C++提交 RE,用G++提交 Wa。

 

偶的天........哎,代码如下:

 

#include <iostream>
using namespace std;
#include <cstdio>
#include <cstdlib>
#include <algorithm>

const int N=605;
const int INF=20000000;
int n,m;
int dist[N];
int b[N];
int map[N][N];
bool used[N];
bool init()
{
    int i,j;
    scanf("%d",&n);
    if(n==0) return false;
    for(i=1;i<=n;i++)
        used[i]=false;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i!=j)map[i][j]=INF;
            else  map[i][j]=0;
    scanf("%d",&m);
    int s,e,v;
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&s,&e,&v);
        if(map[s][e]>v) map[s][e]=map[e][s]=v;
     }
    for(i=1;i<=n;i++)
        scanf("%d",&b[i]);
    return true;
}

void solve()
{
    int i,j,k,min;
    for(i=1;i<=n;i++)
        dist[i]=map[1][i];
    used[1]=true;
    for(i=1;i<=n;i++)
    {
        min=INF;
k=1;
        for(j=1;j<=n;j++)
            if(!used[j]&&dist[j]<min)
min=dist[j],k=j;
       // if(min==INF) break;
           used[k]=true;
        for(j=1;j<=n;j++)
            if(!used[j]&&dist[k]+map[k][j]<dist[j])
if(!(b[k]==2&&b[j]==1))
                    dist[j]=dist[k]+map[k][j];
    }
/* for(i=1;i<=n;i++)
{
        for(j=1;j<=n;j++)
     printf("%10d",map[i][j]);
cout<<endl;
}
for(i=1;i<=n;i++)
cout<<dist[i]<<" ";
cout<<endl;
*/
    if(dist[2]>=INF) printf("-1/n");
    else printf("%d/n",dist[2]);
}
int main()
{
    //freopen("1.in","r",stdin);
    while(init())
    {
        solve();
    }
    return 1;
}

 

还有郁闷的,就是freopen前面没加两个斜杠,结果贡献了两个 WA,再郁闷。

提交发现 是 0MS,吼吼~~~~~

抱歉!评论已关闭.