poj 3259 最短路

2014/12/11


嚇我一跳,還以爲連最短路都不會敲了。

debug發現輸入弄錯了

                 for(int i =0 ;i < m; i++)
		    {
    			 scanf("%d%d%d",&a,&b,&c);
		         s[a][b] = Min(c,s[a][b]);
		         s[b][a] = Min(c,s[b][a]);
    		}

這個寫錯寫成

                     for(int i =0 ;i < m; i++)    
    			 scanf("%d%d%d",&a,&b,&c);
		         s[a][b] = Min(c,s[a][b]);
		         s[b][a] = Min(c,s[b][a]);
    		

也是累,題目不難,對於時間不太有把握就不用暴力的了。根據蟲洞的數量去dij, 有蟲洞 a->b = w存在,那你就去求下,b->a的最短路長度 S ,然後看S-W 是否小於0就好。


#include<stdio.h>
#include<string.h>
#define inf 50000000
using namespace std;

int s[600][600];
int dp[600];
int vis[600];
struct edge{
	int l,r,t;
}ss[500];

int Min(int a,int b)
{
	return a<b?a:b;
}


int main()
{
	int tot;
	while(~scanf("%d",&tot))
	{
		int n, m, w;
		int a, b , c;
		while(tot--)
		{
			for(int i = 0 ;i < 600; i++)
			{
				for(int j = 0;j < 600; j++)
			    s[i][j] = inf;
			    s[i][i] = 0;
			}
			
			
			scanf("%d%d%d",&n,&m,&w);
		    for(int i =0 ;i < m; i++)
		    {
    			 scanf("%d%d%d",&a,&b,&c);
		         s[a][b] = Min(c,s[a][b]);
		         s[b][a] = Min(c,s[b][a]);
    		}
		   
		    
		    for(int i = 0;i < w; i++)
		    {
    			scanf("%d%d%d",&ss[i].l,&ss[i].r,&ss[i].t);
    			s[ss[i].l][ss[i].r] = Min(s[ss[i].l][ss[i].r],-ss[i].t);
    		}
    		
    		int temp = 0;
    		
    		for(int k = 0;k < w; k++)
    		{
    			for(int i= 0 ;i < 600; i++)
    			dp[i] = inf,vis[i] =0;
                
    			int ed = ss[k].l;
    			int bn = ss[k].r;
    			dp[bn] = 0;
				vis[bn] = 1;
    			s[ed][bn] = inf;
    			
    			int pos = bn;
		    	for(int i = 1;i <= n; i++)
		    	{
	    			for(int j = 1;j <= n; j++)
	    			{
	    				if(!vis[j])
			    		dp[j] = Min(dp[pos]+s[pos][j],dp[j]);
			    	}
			    	
	    			int mmin = inf;
           			 for(int t = 1;t <= n; ++t)
            		{
              		    if(!vis[t] && dp[t] < mmin)
               		    {
             		         mmin=dp[t];
                 			 pos=t; 
                		}
            		}
            		
           			 vis[pos]=1;

	    		}

	    		if(dp[ed]-ss[k].t < 0)
	    		{
		    		temp = 1;
		    		break;
		    	}
	    		s[ed][bn] = -ss[k].t;
			}
    		
    		if(temp)
    		{
		    	printf("YES\n");
		    }
		    else printf("NO\n");
    		
		}
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章