想看更多的解题报告: http://iyenn.com/rec/1824570.html
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:虫洞问题,现在有n个点,m条边,代表现在可以走的通路,比如从a到b和从b到a需要花费c时间,现在在地上出现了w个虫洞,虫洞的意义就是你从a到b话费的时间是-c(时间倒流,并且虫洞是单向的),现在问你从某个点开始走,能回到从前
解题思路:其实给出了坐标,这个时候就可以构成一张图,然后将回到从前理解为是否会出现负权环,用bellman-ford就可以解出了
- /*
- Memory 196K
- Time 63MS
- */
- #include
- using namespace std;
- #define MAXM 2710
- #define MAXV 505
- #define inf 1<<29
-
- struct{
- int x,y,t;
- }edge[MAXM];
-
- int n,m,w;
-
- int bellman_ford(){
- int i,j,d[MAXV],flag=1,cnt=1;
- for(i=1;i<=n;i++) d[i]=inf;
-
- while(flag){
- flag=0;
- if(cnt++>n) return 1;
- for(i=1;i<=m;i++){
- if(d[edge[i].x]+edge[i].t
1;} - if(d[edge[i].y]+edge[i].t
1;} - }
- for(;i<=m+w;i++)
- if(d[edge[i].y]>d[edge[i].x]-edge[i].t) {d[edge[i].y]=d[edge[i].x]-edge[i].t;flag=1;}
- }
- return 0;
- }
-
- int main(){
- int t,i;
- scanf("%d",&t);
- while(t--){
- scanf("%d%d%d",&n,&m,&w);
- for(i=1;i<=m+w;i++)
- scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].t);
- if(bellman_ford()) printf("YES\n");
- else printf("NO\n");
- }
- return 0;
- }
评论记录:
回复评论: