标签:rac this 判断 div iostream ext line bsp input
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 6647 | Accepted: 2538 | Special Judge |
Description
Input
Output
Sample Input
5 7 1 4 1 1 3 300 3 1 10 1 2 16 2 3 100 2 5 15 5 3 20
Sample Output
1 3 5 2
Source
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int MAXN=105; const int INF=1e6;//改成1e9就不对了 int dis[MAXN][MAXN],mp[MAXN][MAXN]; int R[MAXN][MAXN],path[MAXN]; int N,M,len; int u,v,w; int cnt=0; void Init() { for(int i=0;i<=N;i++) for(int j=0;j<=N;j++) dis[i][j]=INF,R[i][j]=0; cnt=0; } void Path(int s,int t) { if(R[s][t]) { Path(s,R[s][t]); Path(R[s][t],t); } else path[++cnt]=t; } void Floyd() { len=INF; for(int k=1;k<=N;k++) {
//判断负环 for(int i=1;i<k;i++) for(int j=i+1;j<k;j++) { if(len>dis[i][j]+mp[i][k]+mp[k][j]) { len=dis[i][j]+mp[i][k]+mp[k][j]; cnt=0; path[++cnt]=i; Path(i,j); path[++cnt]=k; } } //求最短路 for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) { if(dis[i][j]>dis[i][k]+dis[k][j]) { dis[i][j]=dis[i][k]+dis[k][j]; R[i][j]=k; } } } } int main () { while(~scanf("%d%d",&N,&M)) { Init(); for(int i=1;i<=M;i++) { scanf("%d%d%d",&u,&v,&w); if(dis[u][v]>w)//记录重边 { dis[u][v]=w; dis[v][u]=w; } } for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) mp[i][j]=dis[i][j];//mp判断环的时候要用到 Floyd(); if(len==INF) printf("No solution.\n"); else { for(int i=1;i<=cnt;i++) { if(i!=cnt) printf("%d ",path[i]); else printf("%d\n",path[i]); } } } return 0; }
标签:rac this 判断 div iostream ext line bsp input
原文地址:http://www.cnblogs.com/pealicx/p/6130926.html