題目描述 Description
某陳和某Y 最近對一個遊戲着迷.那是Electronic Arts 今年發佈的優秀的模擬經營類遊戲,Spore. 在Spore 中,玩家將經歷從單細胞生物到星系的統治者的進化過程,創造並守護你自己的文明. 而某陳在經歷了幾天*幾十分鐘/天的遊戲後,也終於已經近乎通關了. 目前,某陳統治着銀河系中標號1 到N 的星系,而他的帝國中心,在星系1 的某顆美麗的行星之上.如同所有銀河系中的文 明一樣,貿易,發展,結盟,擴張,抵抗Grox[銀河系中心的龐大的強悍的恐怖的邪惡帝國]的侵略. 某陳有足夠的力量,他的疆域蔓延幾百個光年.可是Grox 異常強大,他們的飛船出現在某陳瞭解的任何地方,並時常攻擊任 何位置的某陳和盟友的單位[飛船,建築,星球,甚至星系].戰爭在所難免. 某陳將從帝國中心去標號爲N 的星系,他疆域的邊緣,去尋找一個可能存在的通向銀河系中心的黑洞.他要計劃一條合適的 路線. 從星系g1 到達g2,某陳需要花費c1 的代價[主要是燃料,另外還有與沿途Grox 的勢力作戰的花費],c1 小於0 則是因爲 這樣的星系旅行,會給某陳帶來收益[來源於物流差價,以及一些殖民地的稅收..].相應地,c2 則是代表從星系g2 到達g1 的代價.據某陳瞭解,共有M 條這樣的星系間路徑. 爲了戰備,他需要選擇一條總代價最小的路線.
輸入描述 Input Description
輸入文件包括多組數據. 對於每一組數據,第一行有2 個整數n,m,如題目描述中的含義,1<=n<=1000,0<=m<=10000. 接下來的m 行,每行會有四個整數g1,g2,c1,c2,如題目描述中的含義.0<=g1,g2<=n.輸入數據保證所有整數都在[- 10000..10000]的範圍內. n=0,m=0 標識着輸入數據的結束.每個輸入文件包含不超過10 組數據.
輸出描述 Output Description
對於每組輸入數據,輸出一行,爲從星系1 到星系N 的最小代價的路線的代價. 如果這樣的路線不存在,輸出’No such path’.
樣例輸入 Sample Input
3 2 1 2 2 -1 2 3 0 1 0 0
樣例輸出 Sample Output
2
數據範圍及提示 Data Size & Hint
jiantimu
據說這是個裸題,然後我看了一眼題,這不是手速題麼,趕緊spfa水過去…然後成功GG…最後發現忘了清空隊列,還忘了判負環…簡直不能更zz了…趕緊水過…(閱讀理解題真的好惡心)
代碼如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAX_V=10000+10;
const int MAX_E=100000+10;
int first[MAX_V],nxt[MAX_E<<1],d[MAX_V];
struct edge{
int from,to,cost;
}es[MAX_E<<1];
int tot;
int tim[MAX_V];
bool vis[MAX_V];
int n,m;
queue<int>q;
void init()
{
memset(first,-1,sizeof(first));
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
memset(tim,0,sizeof(tim));
while(q.size()) q.pop();
tot=0;
}
void build(int ff,int tt,int dd)
{
es[++tot]=(edge){ff,tt,dd};
nxt[tot]=first[ff];
first[ff]=tot;
}
bool spfa(int s)
{
d[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=first[u];i!=-1;i=nxt[i])
{
int v=es[i].to;
if(d[v]>d[u]+es[i].cost)
{
d[v]=d[u]+es[i].cost;
if(!vis[v])
{
if(++tim[u]>n)
return false;
vis[v]=1;
q.push(v);
}
}
}
}
return true;
}
int main()
{
while(cin>>n>>m&&n&&m)
{
init();
int ff,tt,dd1,dd2;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&ff,&tt,&dd1,&dd2);
build(ff,tt,dd1);
build(tt,ff,dd2);
}
if(spfa(1))
{
if(d[n]==0x3f3f3f3f)
puts("No such path");
else
printf("%d\n",d[n]);
}
else
puts("No such path");
}
return 0;
}