5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
1 -1題意:琪琪想要去拜訪她的朋友,但是這貨容易暈車,所以要找一個花費時間最少的路線。現在給你路線圖,讓你找出從她家附近的起點站(可以有多個)到朋友家附近的終點站(只有一個)花費時間最少的路線。各個站點的編號從1到n。 思路:最開始我是直接無腦用DIJ算法做的結果絲毫不意外(TLE)了,FUCK。看了看別人的思路才造應該把終點當起點反向構圖,注意,這是個單向圖。 AC代碼:
#include#include #define INF 0x3f3f3f3f #include using namespace std; int vis[1010],map[1010][1010],dis[1010],n,ans[1010],num,beg; void init(){ for(int i=1;i<=n;i++) for(int j=0;j<=n;j++){ if(i==j) map[i][j]=map[j][i]=0; else map[i][j]=map[j][i]=INF; } } void dijkstra(){ int k=0,flag=0,i; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) dis[i]=map[beg][i]; vis[beg]=1; for(i=1;i<=n;i++){ int j,key,temp=INF; for(int j=1;j<=n;j++) if(!vis[j]&&temp>dis[j]) temp=dis[key=j]; if(temp==INF){ break; } vis[key]=1; for(int j=1;j<=n;j++) if(!vis[j]&&dis[j]>dis[key]+map[key][j]) dis[j]=dis[key]+map[key][j]; } } int main(){ int m; while(scanf(%d%d%d,&n,&m,&beg)!=EOF){ int i; memset(ans,INF,sizeof(INF)); init();//注意要初始化。 for(i=1;i<=m;i++){ int a,b,cost; scanf(%d%d%d,&a,&b,&cost); if(map[b][a]>cost)//過濾掉相同的邊。反向構圖。 map[b][a]=cost; } scanf(%d,&num); dijkstra();//直接找到各個終點的位置。 for(i=0;i