程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 3259 Wormholes

POJ 3259 Wormholes

編輯:C++入門知識

題意:John的農場裡field塊地,path條路連接兩塊地,hole個蟲洞,蟲洞是一條單向路,不但會把你傳送到目的地,而且時間會倒退Ts。我們的任務是知道會不會在從某塊地出發後又回來,看到了離開之前的自己。

 

思路:用bellman-ford 判斷有沒有負權回路,如果有他就能看到自己。 不過,我認為應該判斷每個點有沒有負權回路,而不僅僅只判斷第一個點就行了。

AC代碼

 

[cpp] 
#include <iostream>  
#include <cstdio>  
#include <cstring>  
using namespace std; 
const int VM=520; 
const int EM=2600; 
const int INF=0x3f3f3f3f; 
struct Edge{ 
    int u,v; 
    int cap; 
}edge[EM<<1]; 
int n,m,k; 
int cnt,dis[VM]; 
int Bellman() 

    int i,j; 
    for(i=1;i<=n;i++) 
    { 
        dis[i]=INF; 
    } 
    dis[1]=0; 
    for(i=1;i<=n;i++) 
    { 
        for(j=1;j<=cnt-1;j++) 
        { 
            if(dis[edge[j].v]>dis[edge[j].u]+edge[j].cap) 
            { 
                dis[edge[j].v]=dis[edge[j].u]+edge[j].cap; 
            } 
        } 
    } 
    for(j=1;j<cnt-1;j++) 
    { 
        if(dis[edge[j].v]>dis[edge[j].u]+edge[j].cap) 
        { 
            return 0; 
        } 
    } 
    return 1; 

int main() 

    int t; 
    scanf("%d",&t); 
    while(t--) 
    { 
        scanf("%d%d%d",&n,&m,&k); 
        cnt=1; 
        int u,v,w; 
        while(m--) 
        { 
            scanf("%d%d%d",&u,&v,&w); 
            edge[cnt].u=u; 
            edge[cnt].v=v; 
            edge[cnt++].cap=w; 
            edge[cnt].u=v; 
            edge[cnt].v=u; 
            edge[cnt++].cap=w; 
        } 
        while(k--) 
        { 
            scanf("%d%d%d",&u,&v,&w); 
            edge[cnt].u=u; 
            edge[cnt].v=v; 
            edge[cnt++].cap=-w; 
        } 
        int ans=Bellman(); 
        if(ans==0){ 
            printf("YES\n"); 
        } 
        else 
        { 
            printf("NO\n"); 
        } 
    } 
    return 0; 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int VM=520;
const int EM=2600;
const int INF=0x3f3f3f3f;
struct Edge{
    int u,v;
    int cap;
}edge[EM<<1];
int n,m,k;
int cnt,dis[VM];
int Bellman()
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        dis[i]=INF;
    }
    dis[1]=0;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=cnt-1;j++)
        {
            if(dis[edge[j].v]>dis[edge[j].u]+edge[j].cap)
            {
                dis[edge[j].v]=dis[edge[j].u]+edge[j].cap;
            }
        }
    }
    for(j=1;j<cnt-1;j++)
    {
        if(dis[edge[j].v]>dis[edge[j].u]+edge[j].cap)
        {
            return 0;
        }
    }
    return 1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&k);
        cnt=1;
        int u,v,w;
        while(m--)
        {
            scanf("%d%d%d",&u,&v,&w);
            edge[cnt].u=u;
            edge[cnt].v=v;
            edge[cnt++].cap=w;
            edge[cnt].u=v;
            edge[cnt].v=u;
            edge[cnt++].cap=w;
        }
        while(k--)
        {
            scanf("%d%d%d",&u,&v,&w);
            edge[cnt].u=u;
            edge[cnt].v=v;
            edge[cnt++].cap=-w;
        }
        int ans=Bellman();
        if(ans==0){
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved